<?php
/**
 * ApiController class.
 * ApiController is to base class for API REST.
 * 
 * Yamii for Business 版权所有 @ 2010 - 2012.
 */
class ApiController extends CController
{
	public function actionError() {
		$error = Yii::app()->errorHandler->error;
		if ($error) {
			$this->_sendJSON($error['code'], $error['message']);
		}
	}
	
	protected function beforeAction($action) {
		//always set language
		$lang = Yii::app()->request->getParam('lang', null);
		if (!empty($lang)) {
			if (Yii::app()->language !== $lang) {
				BUtils::SetLanguage($lang);
			}
		}
		
		//always writing logs
		$hid = Yii::app()->request->getParam('hid', 'none');
		BUtils::APILogging('URL', Yii::app()->request->url, $hid);
		BUtils::APILogging('Client', Yii::app()->request->getUserAgent(), $hid);
		BUtils::APILogging('GET', $_GET, $hid);
		BUtils::APILogging('POST', $_POST, $hid);
		
		return parent::beforeAction($action);;
	}

	/**
	 * Authericate with hid + key.
	 * @param string $hid
	 * @param string $key
	 * @return int Merchant ID 
	 */
	protected function _auth($hid, $key) {
		if (empty($hid)) $this->_sendError('Parameter hid is missing!');
		if (empty($key)) $this->_sendError('Parameter key is missing!');
		$id = BUtils::Decrypt($hid);
		if ($id < 10000) $this->_sendError('You have not signed in!');
		return $id;
	}
	
	protected function _sendJSON($status, $message) {
		$json_string = array(
			'code' => $status,
			'message' => $message,
		);
		$this->_sendResponse(200, CJSON::encode($json_string), 'application/json');
	}
	
	protected function _sendError($message) {
		$json_string = array(
			'code' => 500,
			'message' => $message,
		);
		$this->_sendResponse(200, CJSON::encode($json_string), 'application/json');
	}
	
	protected function _sendResponse($status = 200, $body = '', $content_type = 'text/html')
	{
		// set the status
		$status_header = 'HTTP/1.1 ' . $status . ' ' . $this->_getStatusCodeMessage($status);
		header($status_header);
		// and the content type
		header('Content-type: ' . $content_type);

		// pages with body are easy
		if ($body != '') {
			// send the body
			echo $body;
		}
		// we need to create the body if none is passed
		else
		{
			// create some body messages
			$message = '';

			// this is purely optional, but makes the pages a little nicer to read
			// for your users.  Since you won't likely send a lot of different status codes,
			// this also shouldn't be too ponderous to maintain
			switch($status)
			{
				case 401:
					$message = 'You must be authorized to view this page.';
					break;
				case 404:
					$message = 'The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found.';
					break;
				case 500:
					$message = 'The server encountered an error processing your request.';
					break;
				case 501:
					$message = 'The requested method is not implemented.';
					break;
			}

			// servers don't always have a signature turned on 
			// (this is an apache directive "ServerSignature On")
			$signature = ($_SERVER['SERVER_SIGNATURE'] == '') ? $_SERVER['SERVER_SOFTWARE'] . ' Server at ' . $_SERVER['SERVER_NAME'] . ' Port ' . $_SERVER['SERVER_PORT'] : $_SERVER['SERVER_SIGNATURE'];

			// this should be templated in a real-world solution
			$body = '<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>' . $status . ' ' . $this->_getStatusCodeMessage($status) . '</title>
</head>
<body>
	<h1>' . $this->_getStatusCodeMessage($status) . '</h1>
	<p>' . $message . '</p>
	<hr />
	<address>' . $signature . '</address>
</body>
</html>';

			echo $body;
		}
		Yii::app()->end();
	}
	
	/**
	 * get status message.
	 * @param int $status
	 * @return string 
	 */
	protected function _getStatusCodeMessage($status) {
		$codes = Array(
			100 => 'Continue',
			101 => 'Switching Protocols',
			200 => 'OK',
			201 => 'Created',
			202 => 'Accepted',
			203 => 'Non-Authoritative Information',
			204 => 'No Content',
			205 => 'Reset Content',
			206 => 'Partial Content',
			300 => 'Multiple Choices',
			301 => 'Moved Permanently',
			302 => 'Found',
			303 => 'See Other',
			304 => 'Not Modified',
			305 => 'Use Proxy',
			306 => '(Unused)',
			307 => 'Temporary Redirect',
			400 => 'Bad Request',
			401 => 'Unauthorized',
			402 => 'Payment Required',
			403 => 'Forbidden',
			404 => 'Not Found',
			405 => 'Method Not Allowed',
			406 => 'Not Acceptable',
			407 => 'Proxy Authentication Required',
			408 => 'Request Timeout',
			409 => 'Conflict',
			410 => 'Gone',
			411 => 'Length Required',
			412 => 'Precondition Failed',
			413 => 'Request Entity Too Large',
			414 => 'Request-URI Too Long',
			415 => 'Unsupported Media Type',
			416 => 'Requested Range Not Satisfiable',
			417 => 'Expectation Failed',
			500 => 'Internal Server Error',
			501 => 'Not Implemented',
			502 => 'Bad Gateway',
			503 => 'Service Unavailable',
			504 => 'Gateway Timeout',
			505 => 'HTTP Version Not Supported',
		);
		return (isset($codes[$status])) ? $codes[$status] : '';
	}
}